#include <iostream>
const int N = 30;
const int M = 20;
using namespace std;
int v, g;
int a[N];
int b[M][N];
int cnt, path, ret = N, st;
bool check()
{
    //  zdl:: 先循环维他命的种类
    for (int i = 1; i <= v; i++)
    {
        int sum = 0;
        for (int j = 1; j <= g; j++)
        {
            if ((path >> j) & 1)
                sum += b[j][i];
        }
        if (sum < a[i])
            return false;
    }
    return true;
}
void dfs(int p)
{
    if (cnt >= ret)
        return;
    if (check())
    {
        // cout << "ret : " << ret << endl;
        ret = cnt;
        st = path;
        return;
    }
    if (p > g)
        return;
    // 选
    cnt++;
    path |= (1 << p);
    dfs(p + 1);
    // 回归现场
    cnt--;
    path &= ~(1 << p);

    // 不选
    dfs(p + 1);
}
int main()
{
    cin >> v;
    for (int i = 1; i <= v; i++)
        cin >> a[i];
    cin >> g;
    for (int i = 1; i <= g; i++)
    {
        for (int j = 1; j <= v; j++)
        {
            cin >> b[i][j];
        }
    }
    // 现在使用dfs就可以直接解决这个问题
    dfs(1);
    cout << ret << " ";
    for (int i = 1; i <= g; i++)
    {
        if ((st >> i) & 1)
            cout << i << " ";
    }
    return 0;
}

// 不敢相信，竟然还只是一道普及的题目！！
// 西八shake it